package com.qf.controller;

import com.qf.pojo.User;
import com.qf.pojo.UserVo;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.naming.Name;
import javax.servlet.http.HttpServletRequest;
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;

/**
 * @author 汤奇
 * @version V1.0
 * @Project BookPro
 * @Package com.qf.controller
 * @Description:
 * @Date 2022/6/7 22:40
 */
@Controller
@RequestMapping("/param")
public class ParamController {

    /**
     * 演示springMVC默认支持的接收参数类型:
     *      默认支持的参数就是可以加在参数上, 也可以不加, 可以按照自己需要添加删除
     *      HttpServletRequest, HttpServletResponse,HttpSession,Model
     * 如果controller方法返回String字符串, 那么就认为这个字符串就是页面的路径, 会自动走视图解析器
     * 拼接视图解析器中的前缀和后缀组装成完整的页面路径
     * */
    @RequestMapping("/test1")
    public String test1(HttpServletRequest request, Model model){
        String id = request.getParameter("id");
        String name = request.getParameter("name");

        System.out.println("========"+id);
        System.out.println("========"+name);

        //相当于request.setAttribute方法, 将数据放入请求域中带到页面中展示使用
        model.addAttribute("id",id);
        model.addAttribute("name",name);
        //指定返回数据并跳转到hello页面
        return "hello";
    }


    /**
     * 测试接收浏览器发送过来的基本类型参数:
     * 参数: integer, float, double, boolean, String等
     * */
    @RequestMapping("/test2")
    public String test2(Integer id,String name, Model model){

        System.out.println("========"+id);
        System.out.println("========"+name);

        //相当于request.setAttribute方法, 将数据放入请求域中带到页面中展示使用
        model.addAttribute("id",id);
        model.addAttribute("name",name);
        //指定返回数据并跳转到hello页面
        return "hello";
    }

    /**
     * 接收pojo实体类
     * 使用: 浏览器传入的参数过多, 可以将参数封装为一个实体类进行接收
     * */
    @RequestMapping("/test3")
    public String test3(User user, Model model){

        System.out.println("========"+user);


        //相当于request.setAttribute方法, 将数据放入请求域中带到页面中展示使用
        model.addAttribute("user",user);

        //指定返回数据并跳转到hello页面
        return "hello";
    }

    /**
     * 接收数组类型参数:
     *      一般页面中如果表单使用post方式提交, 那么checkbox复选框的内容, 一般都是数组
     *      那么要求name属性名称, 必须等于接收的变量名
     * */
    @RequestMapping("/test4")
    public String test4(String[] hobby, Model model){

        System.out.println("========"+hobby);


        //相当于request.setAttribute方法, 将数据放入请求域中带到页面中展示使用
        model.addAttribute("hobby",hobby);

        //指定返回数据并跳转到hello页面
        return "hello";
    }

    /**
     * 演示接收list类型参数, 一般行编辑需要的时候使用
     * */
    @RequestMapping("/test5")
    public String test5(UserVo vo, Model model){

        System.out.println("========"+vo);

        //指定返回数据并跳转到hello页面
        return "hello";
    }

    /**
     * 演示接收restful风格参数
     * 访问路径http://localhost:8080/类的路径/方法的路径/51/詹野种
     * */

    @RequestMapping("/test6/{id}/{name}")
    public String test6(@PathVariable("id") Integer id, @PathVariable("name") String name) throws UnsupportedEncodingException {
        //手动转码
        name = new String(name.getBytes(),"utf-8");

        System.out.println("============"+id+"=="+name);

        //指定返回数据并跳转到hello页面
        return "hello";
    }

    /**
     * 演示请求转发
     * */
    @RequestMapping("/test7")
    public String test7(Integer id, String name,Model model) throws UnsupportedEncodingException {
        System.out.println("============"+id+"=="+name);
        model.addAttribute("id",id);
        model.addAttribute("name", name);
        //指定返回数据并跳转到hello页面
        return "forward:/param/test3";
    }

    /**
     * 演示重定向
     * */
    @RequestMapping("/test8")
    public String test8(Integer id, String name,Model model) throws UnsupportedEncodingException {
        System.out.println("============"+id+"=="+name);
        model.addAttribute("id",id);
        model.addAttribute("name", name);
        //指定返回数据并跳转到hello页面
        return "redirect:http://www.baidu.com";
    }
}
